/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package ig.metrica.ui.modelo.modelotablas;

import ig.finanzas.TasaPK;
import ig.finanzas.riesgo.FactorRiesgoPersonal;
import ig.metrica.riesgo.FactorRiesgoPersonalMetrica;
import ig.util.excepciones.DatoInvalidoExcepcion;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.Hashtable;
import javax.swing.table.AbstractTableModel;

/**
 *
 * @author jsanchez
 */
public class ModeloTablaPAFC extends AbstractTableModel{

    private String[] titulos1 = { ".", "Factor Riesgo Asociado", "Tasa Asociada" };
    private Hashtable relacionFactores;
    private Hashtable relacionFactoresPantalla;
    private TasaPK valorPorDefecto;
    private Hashtable listaTasasFactores;

    public ModeloTablaPAFC(Hashtable relacionFactores, TasaPK valorPorDefecto){
        this.relacionFactores = relacionFactores;
        this.valorPorDefecto = valorPorDefecto;
        if (listaTasasFactores==null)
            listaTasasFactores = new Hashtable();
    }

    public Hashtable getListaTasasFactores() {
        return listaTasasFactores;
    }

    public Hashtable getRelacionFactoresPantalla() {
        return relacionFactoresPantalla;
    }

    public String[] getTitulos1() {
        return titulos1;
    }

    public TasaPK getValorPorDefecto() {
        return valorPorDefecto;
    }

    public void setValorPorDefecto(TasaPK valorPorDefecto) {
        this.valorPorDefecto = valorPorDefecto;
    }

    public void setRelacionFactores(Hashtable relacionFactores){
        this.relacionFactores = relacionFactores;
        fireTableDataChanged();
    }
    public void setRelacionFactoresPantalla(Hashtable relacionFactores){
        this.relacionFactoresPantalla = relacionFactores;
        fireTableDataChanged();
    }
    public Hashtable getRelacionFactores(){
        return relacionFactores;
    }

    public String getColumnName(int col){
        return titulos1[col];
    }

    public Class getColumnClass(int col){
        return String.class;
    }

    public int getColumnCount(){
        return titulos1.length;
    }

    public int getRowCount(){
        return relacionFactores.size();
    }

    public boolean isCellEditable(int row, int col){

        //La columna donde se escoge Precio o Tasa siempre es editable
        if (col==1)
            return true;


        ArrayList factorestemp = new ArrayList(relacionFactores.keySet());
        Collections.sort(factorestemp);
        Object llave = factorestemp.get(row);
        FactorRiesgoPersonal factor = (FactorRiesgoPersonal)relacionFactores.get(llave);

        byte tipo = factor.getTipo();
        //La columna donde se escoge el tipo de tasa solo es editable si el factor es de tipo tasa
        if (col==2 && tipo==FactorRiesgoPersonal.TIPO_FACTORTASA)
            return true;

        return false;
    }

    public void setValueAt(Object value, int row, int col){

        ArrayList factorestemp = new ArrayList(relacionFactores.keySet());
        Collections.sort(factorestemp);
        Object llave = factorestemp.get(row);
        FactorRiesgoPersonal factor = (FactorRiesgoPersonal)relacionFactores.get(llave);
        if (col==1){

            if (((String)value).equals("PRECIO")){

                //Si se especifica PRECIO se debe crear un nuevo factor
                FactorRiesgoPersonal nuevofactor = null;
                try {
                    nuevofactor = new FactorRiesgoPersonalMetrica(factor.getFactorRiesgoMatrizCorrelacion(), factor.getDefinidorCalculoCambioEsperado());
                } catch (DatoInvalidoExcepcion e) {
                }
                //Se elimina la asociacion anterior y se registra la nueva.
                relacionFactores.remove(llave);
                relacionFactores.put(llave, nuevofactor);

                fireTableCellUpdated(row, col+1);
            }else if (((String)value).equals("TASA")){
                //Si se especifica TASA. Si no se encuentra registrada la tasa por defecto se registra y se hace la
                //asociacion. Si ya esta registrada, la asociacion se hace inmediatamente.
                if(!listaTasasFactores.containsKey(valorPorDefecto)){
                    FactorRiesgoPersonal nuevofactor = null;
                    try {
                        nuevofactor = new FactorRiesgoPersonalMetrica(valorPorDefecto, factor.getFactorRiesgoMatrizCorrelacion(), factor.getDefinidorCalculoCambioEsperado());
                    } catch (DatoInvalidoExcepcion e) {
                    }
                    listaTasasFactores.put(valorPorDefecto, nuevofactor);
                    relacionFactores.remove(llave);
                    relacionFactores.put(llave, nuevofactor);
                }else{
                    FactorRiesgoPersonal nuevofactor = (FactorRiesgoPersonal)listaTasasFactores.get(valorPorDefecto);
                    relacionFactores.remove(llave);
                    relacionFactores.put(llave, nuevofactor);
                }
                fireTableCellUpdated(row, col+1);
            }else{
//               System.out.println(this.getClass().getName()+" Es para TASA DE DESCUENTO. - 432");

                FactorRiesgoPersonal nuevofactor = null;
                try {
                    TasaPK tasaDeDescuent=new TasaPK("TIPO_FACTORTASA_DESCUENTO");
                    nuevofactor = new FactorRiesgoPersonalMetrica(tasaDeDescuent,factor.getFactorRiesgoMatrizCorrelacion(), factor.getDefinidorCalculoCambioEsperado(),FactorRiesgoPersonal.TIPO_FACTORTASA_DESCUENTO);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                relacionFactores.remove(llave);
                relacionFactores.put(llave, nuevofactor);
                fireTableCellUpdated(row, col+1);
            }

        }else if (col==2){
            //Si se cambia la tasa
//            Enumeration enumeration=listaTasasFactores.keys();
//                        System.out.println("");
//                        System.out.println("-"+value+"-");
//                        while(enumeration.hasMoreElements()){
//                            Object obj=enumeration.nextElement();
//                            System.out.println("-"+obj.toString()+"-");
////                            if(obj.toString().trim().equals(value.toString().trim())){
////                                System.out.println("AQUI ES LA VAINA LOCO");
////                            }
//                        }
            if(value instanceof String){
                Enumeration enumeration1=listaTasasFactores.keys();
                //System.out.println("value : "+value.getClass());
                while (enumeration1.hasMoreElements()) {
                    TasaPK key = (TasaPK)enumeration1.nextElement();
                    if(key.getNombre().trim().equals(value.toString().trim())){
                        value=key;
                    }
                }
                if(value instanceof String){
                    value=new TasaPK(value.toString().trim());
                }
                //System.out.println("value : "+value.getClass());
                //System.out.println("value : "+value);
                //System.out.println("value : "+listaTasasFactores);
            }

            //System.out.println("TasaPK : "+((TasaPK)value).getIdInterna());
            if (listaTasasFactores.containsKey((TasaPK)value)){
                FactorRiesgoPersonal nuevofactor = (FactorRiesgoPersonal)listaTasasFactores.get((TasaPK)value);
                relacionFactores.remove(llave);
                relacionFactores.put(llave, nuevofactor);
            }else{
                FactorRiesgoPersonal nuevofactor=null;
                try {
                    nuevofactor = new FactorRiesgoPersonalMetrica((TasaPK)value, factor.getFactorRiesgoMatrizCorrelacion(), factor.getDefinidorCalculoCambioEsperado());
                } catch (DatoInvalidoExcepcion e) {
                }
                listaTasasFactores.put((TasaPK)value, nuevofactor);
                relacionFactores.remove(llave);
                relacionFactores.put(llave, nuevofactor);
            }

        }

        fireTableCellUpdated(row, col);

    }

    public Object getValueAt(int row, int col){
        if (col==0){
            ArrayList factorestemp = new ArrayList(relacionFactores.keySet());
            Collections.sort(factorestemp);
            Object llave = factorestemp.get(row);
            String llave1= null;
            String tmp= null;
            try {
                tmp=llave.toString().trim();
                llave1=(String) relacionFactoresPantalla.get(tmp);
            } catch (Exception e) {}

            if(llave1!=null)
                return llave1 + " : "+ llave;
            else//  jsanchez
                return llave;
        }else{

            ArrayList factorestemp = new ArrayList(relacionFactores.keySet());
            Collections.sort(factorestemp);
            Object llave = factorestemp.get(row);

            FactorRiesgoPersonal factor = (FactorRiesgoPersonal)relacionFactores.get(llave);

            byte tipo = factor.getTipo();
//            System.out.println("TIPO:"+tipo);
            if (col==1){
                if (tipo==FactorRiesgoPersonal.TIPO_FACTORTASA)
                    return new String("TASA");
                else if (tipo==FactorRiesgoPersonal.TIPO_FACTORPRECIO)
                    return new String("PRECIO");
                else
                    return new String("TASA DE DESCUENTO");
            }else{
                if (tipo==FactorRiesgoPersonal.TIPO_FACTORTASA)
                    return factor.getTasaPK().toString();
                else
                    return new String("");
            }
        }
    }

}
